export class Color {
	/**
	 * 转化 RGB 为 HEX
	 * @param rgb {string}  如：RGB(255,255,255) => #FFFFFF
	 */
	rgbToHex(rgb) {
		const color = rgb;
		if (!this.isRgb(color)) return color.toString();

		let strHex = '#';
		// 把RGB的3个数值变成数组
		const colorArr = color.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',');

		// 转成16进制
		colorArr.forEach((item) => {
			let hex = Number(item).toString(16);

			if (hex.length === 1) {
				hex = '0' + hex;
			}

			strHex += hex;
		});

		return strHex;
	}

	/**
	 * 转化 RGBA 为 HEXA
	 * @param rgba {string}  如：RGBA(255,255,255,0.15) => #FFFFFF26
	 */
	rgbaToHexa(rgba) {
		const color = rgba;
		if (!this.isRgba(color)) return color.toString();

		let strHexa = '#';
		// 把 RGBA 的 4 个数值变成数组
		const colorArr = color.replace(/(?:\(|\)|rgba|RGBA)*/g, '').split(',');

		// 转成16进制
		colorArr.forEach((item, index) => {
			let hex = Math.round((index === 3 ? 255 : 1) * item).toString(16);

			if (hex.length === 1) {
				hex = '0' + hex;
			}

			strHexa += hex;
		});

		return strHexa;
	}

	/**
	 * 转化 HEX 为 RGB
	 * @param hex {string}  如：#FFFFFF => RGB(255,255,255)
	 * @returns {string}
	 */
	hexToRgb(hex) {
		// 把颜色值变成小写
		let color = hex.toLowerCase();

		if (!this.isHex(color)) return color;

		// 如果只有三位的值，需变成六位，如：#fff => #ffffff
		if (color.length === 4) {
			let colorNew = '#';
			for (let i = 1; i < 4; i += 1) {
				colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
			}
			color = colorNew;
		}
		// 处理六位的颜色值，转为RGB
		const colorChange = [];
		for (let i = 1; i < 7; i += 2) {
			colorChange.push(parseInt('0x' + color.slice(i, i + 2)));
		}
		return 'rgb(' + colorChange.join(',') + ')';
	}

	/**
	 * 转化 HEXA 为 RGBA
	 * @param hexa {string}  如：#FFFFFF16 => RGBA(255,255,255,0.15)
	 * @returns {string}
	 */
	hexaToRgba(hexa) {
		// 把颜色值变成小写
		let color = hexa.toLowerCase();
		if (!this.isHexa(color)) return color;

		// 如果只有三位的值，需变成八位，如：#ffff => #ffffffff
		if (color.length === 5) {
			let colorNew = '#';
			for (let i = 1; i < 5; i += 1) {
				colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
			}
			color = colorNew;
		}
		// 处理八位的颜色值，转为RGBA
		const colorChange = [];
		for (let i = 1; i < 9; i += 2) {
			const num = parseInt('0x' + color.slice(i, i + 2));
			colorChange.push(
				i < 7 ? num : num % 255 === 0 ? num / 255 : Math.round((num / 255) * 100) / 100
			);
		}
		return 'rgba(' + colorChange.join(',') + ')';
	}

	/**
	 * 颜色值转为浮点类型数组
	 * @param color {string}
	 * @returns {string[]|*}
	 */
	toFloatArr(color) {
		if (this.isRgb(color)) {
			const arr = color.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',');
			return arr.map((item) => item / 255);
		}

		if (this.isRgba(color)) {
			const arr = color.replace(/(?:\(|\)|rgba|RGBA)*/g, '').split(',');
			const alpha = +arr.pop();
			return [...arr.map((item) => item / 255), alpha];
		}

		if (this.isHex(color)) {
			const rgb = this.hexToRgb(color);
			return this.toFloatArr(rgb);
		}

		if (this.isHexa(color)) {
			const rgba = this.hexaToRgba(color);
			return this.toFloatArr(rgba);
		}

		return color;
	}

	/**
	 * 颜色值转为数组
	 * @param color {string}
	 * @returns {string[]|*}
	 */
	toArr(color) {
		if (this.isRgb(color)) {
			return color
				.replace(/(?:\(|\)|rgb|RGB)*/g, '')
				.split(',')
				.map((num) => +num);
		}

		if (this.isRgba(color)) {
			return color
				.replace(/(?:\(|\)|rgba|RGBA)*/g, '')
				.split(',')
				.map((num) => +num);
		}

		if (this.isHex(color)) {
			const rgb = this.hexToRgb(color);
			return this.toArr(rgb);
		}

		if (this.isHexa(color)) {
			const rgba = this.hexaToRgba(color);
			return this.toArr(rgba);
		}

		return color;
	}

	/**
	 * 颜色转指定透明度的 RGBA 形式
	 * @param color {string}
	 * @param alpha {number}
	 */
	toRgba(color, alpha = 1) {
		const colorArr = this.toArr(color);

		if (colorArr.length === 4) colorArr.pop();

		return `rgba(${colorArr.join(',')},${alpha})`;
	}

	/**
	 * 颜色转RGB
	 * @param color
	 * @returns {string}
	 */
	toRgb(color) {
		const colorArr = this.toArr(color);

		if (colorArr.length === 4) colorArr.pop();

		return `rgb(${colorArr.join(',')})`;
	}

	isRgbOrRgba(color) {
		return /^(rgb|RGB)/.test(color);
	}

	isRgb(color) {
		return /^(rgb\(|RGB\()/.test(color);
	}

	isRgba(color) {
		return /^(rgba\(|RGBA\()/.test(color);
	}

	isHex(color) {
		return /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(color);
	}

	isHexa(color) {
		return /^#([0-9a-fA-f]{4}|[0-9a-fA-f]{8})$/.test(color);
	}
}
